/*!
 * \file HisDataMgr.h
 * \project WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief 历史数据管理器定义文件
 * 
 * \details 本文件定义了HisDataMgr类，用于在WonderTrader回测框架中管理历史数据的加载和访问。
 *          历史数据管理器的主要功能包括：
 *          - 初始化和配置数据读取器
 *          - 提供统一的历史K线数据加载接口
 *          - 提供统一的历史tick数据加载接口
 *          - 实现数据读取过程中的日志记录
 *          - 支持通过回调函数异步处理数据加载结果
 *          - 作为IBtDtReaderSink的实现，处理数据读取事件
 */
#pragma once
#include <functional>
#include "../Includes/IBtDtReader.h"

/*!
 * \typedef FuncLoadDataCallback
 * \brief 数据加载回调函数类型定义
 * 
 * \details 用于定义数据加载完成后的回调函数类型。
 *          回调函数接收一个字符串引用参数，用于传递加载结果或错误信息。
 */
typedef std::function<void(std::string&)> FuncLoadDataCallback;

NS_WTP_BEGIN
class WTSVariant;
NS_WTP_END

USING_NS_WTP;

/*!
 * \class HisDataMgr
 * \brief 历史数据管理器类
 * 
 * \details HisDataMgr是WonderTrader回测框架中的历史数据管理组件，负责统一管理和提供历史数据的访问接口。
 *          该类继承自IBtDtReaderSink接口，用于处理底层数据读取器的事件回调。
 *          
 *          主要功能：
 *          - 管理数据读取器的生命周期
 *          - 提供K线数据和tick数据的统一加载接口
 *          - 处理数据加载过程中的日志记录
 *          - 支持异步数据加载和回调处理
 *          
 *          使用场景：
 *          - 回测引擎需要加载历史K线数据进行策略回测
 *          - 回测引擎需要加载历史tick数据进行高频策略回测
 *          - 需要统一的数据访问接口来屏蔽底层数据存储细节
 */
class HisDataMgr : public IBtDtReaderSink
{
public:
	/*!
	 * \brief 构造函数
	 * 
	 * \details 初始化历史数据管理器，将数据读取器指针设置为NULL。
	 */
	HisDataMgr() :_reader(NULL) {}
	
	/*!
	 * \brief 析构函数
	 * 
	 * \details 清理历史数据管理器资源。
	 */
	~HisDataMgr(){}

public:
	/*!
	 * \brief 数据读取器日志回调方法
	 * 
	 * \param ll 日志级别
	 * \param message 日志消息内容
	 * 
	 * \details 实现IBtDtReaderSink接口的日志回调方法，用于处理数据读取器产生的日志信息。
	 *          该方法会将底层数据读取器的日志信息转发到系统日志中。
	 */
	virtual void reader_log(WTSLogLevel ll, const char* message) override;

public:
	/*!
	 * \brief 初始化历史数据管理器
	 * 
	 * \param cfg 配置参数，包含数据读取器的配置信息
	 * \return 成功返回true，失败返回false
	 * 
	 * \details 根据配置参数初始化历史数据管理器：
	 *          - 解析配置中的数据读取器类型和参数
	 *          - 创建并初始化对应的数据读取器实例
	 *          - 设置数据读取器的回调接口
	 *          
	 *          配置示例：
	 *          \code
	 *          {
	 *              "reader": {
	 *                  "name": "bt",
	 *                  "path": "./storage/"
	 *              }
	 *          }
	 *          \endcode
	 */
	bool	init(WTSVariant* cfg);

	/*!
	 * \brief 加载原始K线数据
	 * 
	 * \param exchg 交易所代码（如"SHFE"、"DCE"等）
	 * \param code 合约代码（如"au2012"、"rb2105"等）
	 * \param period K线周期（如K_MIN1、K_MIN5、K_DAY等）
	 * \param cb 数据加载完成后的回调函数
	 * \return 成功启动加载返回true，失败返回false
	 * 
	 * \details 异步加载指定合约的历史K线数据：
	 *          - 通过底层数据读取器加载K线数据
	 *          - 加载完成后通过回调函数返回结果
	 *          - 支持不同周期的K线数据加载
	 *          - 数据格式为WonderTrader标准的K线数据格式
	 *          
	 *          注意事项：
	 *          - 该方法为异步调用，实际数据通过回调函数返回
	 *          - 回调函数参数为序列化后的K线数据字符串
	 *          - 如果数据不存在或加载失败，回调函数会收到错误信息
	 */
	bool	load_raw_bars(const char* exchg, const char* code, WTSKlinePeriod period, FuncLoadDataCallback cb);

	/*!
	 * \brief 加载原始tick数据
	 * 
	 * \param exchg 交易所代码（如"SHFE"、"DCE"等）
	 * \param code 合约代码（如"au2012"、"rb2105"等）
	 * \param uDate 日期，格式为YYYYMMDD（如20211025）
	 * \param cb 数据加载完成后的回调函数
	 * \return 成功启动加载返回true，失败返回false
	 * 
	 * \details 异步加载指定合约在指定日期的历史tick数据：
	 *          - 通过底层数据读取器加载tick数据
	 *          - 加载完成后通过回调函数返回结果
	 *          - 支持按日期精确加载tick数据
	 *          - 数据格式为WonderTrader标准的tick数据格式
	 *          
	 *          注意事项：
	 *          - 该方法为异步调用，实际数据通过回调函数返回
	 *          - 回调函数参数为序列化后的tick数据字符串
	 *          - tick数据通常包含价格、成交量、买卖盘等详细信息
	 *          - 如果指定日期无数据或加载失败，回调函数会收到错误信息
	 */
	bool	load_raw_ticks(const char* exchg, const char* code, uint32_t uDate, FuncLoadDataCallback cb);

private:
	IBtDtReader*	_reader; /*!< 底层数据读取器指针，用于实际的数据读取操作 */
};

